home *** CD-ROM | disk | FTP | other *** search
/ PC Plus SuperCD (UK) 1998 August / PC Plus SuperCD 50a Issue 142 (CD142a) (August 1998).iso / trial / demon / TURNPIKE.1 / CLASSES.ZIP / sun / AWT / IMAGE / InputStreamImageSource.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-04-14  |  6.2 KB  |  508 lines

  1. package sun.awt.image;
  2.  
  3. import java.awt.image.ColorModel;
  4. import java.awt.image.ImageConsumer;
  5. import java.awt.image.ImageProducer;
  6. import java.io.BufferedInputStream;
  7. import java.io.IOException;
  8. import java.io.InputStream;
  9. import java.util.Hashtable;
  10.  
  11. abstract class InputStreamImageSource implements ImageProducer, ImageFetchable {
  12.    PixelStore pixelstore;
  13.    private ConsumerQueue consumers;
  14.    private boolean awaitingFetch = false;
  15.    private Thread latestFetcher;
  16.    private ImageDecoder decoder;
  17.  
  18.    abstract boolean checkSecurity(Object var1, boolean var2);
  19.  
  20.    synchronized int countConsumers() {
  21.       ConsumerQueue var1 = this.consumers;
  22.  
  23.       int var2;
  24.       for(var2 = 0; var1 != null; var1 = var1.next) {
  25.          ++var2;
  26.       }
  27.  
  28.       return var2;
  29.    }
  30.  
  31.    public void addConsumer(ImageConsumer var1) {
  32.       this.addConsumer(var1, false);
  33.    }
  34.  
  35.    synchronized void addConsumer(ImageConsumer var1, boolean var2) {
  36.       this.checkSecurity((Object)null, false);
  37.  
  38.       ConsumerQueue var3;
  39.       for(var3 = this.consumers; var3 != null && var3.consumer != var1; var3 = var3.next) {
  40.       }
  41.  
  42.       if (var3 == null) {
  43.          var3 = new ConsumerQueue(this, var1);
  44.          var3.next = this.consumers;
  45.          this.consumers = var3;
  46.       } else {
  47.          if (!var3.secure) {
  48.             Object var4 = null;
  49.             SecurityManager var5 = System.getSecurityManager();
  50.             if (var5 != null) {
  51.                var4 = var5.getSecurityContext();
  52.             }
  53.  
  54.             if (var3.securityContext == null) {
  55.                var3.securityContext = var4;
  56.             } else if (var3.securityContext != var4) {
  57.                this.errorConsumer(var3);
  58.                throw new SecurityException("Applets are trading image data!");
  59.             }
  60.          }
  61.  
  62.          var3.interested = true;
  63.       }
  64.  
  65.       if (var2 && var3.feeder == null && !this.awaitingFetch && this.latestFetcher == null) {
  66.          this.startProduction();
  67.       }
  68.  
  69.    }
  70.  
  71.    public synchronized boolean isConsumer(ImageConsumer var1) {
  72.       for(ConsumerQueue var2 = this.consumers; var2 != null; var2 = var2.next) {
  73.          if (var2.consumer == var1) {
  74.             return true;
  75.          }
  76.       }
  77.  
  78.       return false;
  79.    }
  80.  
  81.    synchronized void errorConsumer(ConsumerQueue var1) {
  82.       var1.consumer.imageComplete(1);
  83.       this.removeConsumer(var1.consumer);
  84.    }
  85.  
  86.    public synchronized void removeConsumer(ImageConsumer var1) {
  87.       ConsumerQueue var2 = this.consumers;
  88.  
  89.       for(ConsumerQueue var3 = null; var2 != null; var2 = var2.next) {
  90.          if (var2.consumer == var1) {
  91.             if (var3 == null) {
  92.                this.consumers = var2.next;
  93.             } else {
  94.                var3.next = var2.next;
  95.             }
  96.  
  97.             var2.interested = false;
  98.             return;
  99.          }
  100.  
  101.          var3 = var2;
  102.       }
  103.  
  104.    }
  105.  
  106.    public void startProduction(ImageConsumer var1) {
  107.       this.addConsumer(var1, true);
  108.    }
  109.  
  110.    private synchronized void startProduction() {
  111.       if (!this.awaitingFetch) {
  112.          ImageFetcher.add(this);
  113.          this.awaitingFetch = true;
  114.       }
  115.  
  116.    }
  117.  
  118.    public void requestTopDownLeftRightResend(ImageConsumer var1) {
  119.       synchronized(this){}
  120.  
  121.       PixelStore var2;
  122.       try {
  123.          var2 = this.pixelstore;
  124.       } catch (Throwable var5) {
  125.          throw var5;
  126.       }
  127.  
  128.       if (var2 != null) {
  129.          var2.replay(this, var1, false);
  130.       }
  131.  
  132.    }
  133.  
  134.    protected abstract ImageDecoder getDecoder();
  135.  
  136.    protected ImageDecoder decoderForType(InputStream var1, String var2) {
  137.       if (var2.equals("image/gif")) {
  138.          return new GifImageDecoder(this, var1);
  139.       } else if (var2.equals("image/jpeg")) {
  140.          return new JPEGImageDecoder(this, var1);
  141.       } else {
  142.          return var2.equals("image/x-xbitmap") ? new XbmImageDecoder(this, var1) : null;
  143.       }
  144.    }
  145.  
  146.    protected ImageDecoder getDecoder(InputStream var1) {
  147.       if (!((InputStream)var1).markSupported()) {
  148.          var1 = new BufferedInputStream((InputStream)var1);
  149.       }
  150.  
  151.       try {
  152.          ((InputStream)var1).mark(1000);
  153.          int var2 = ((InputStream)var1).read();
  154.          int var3 = ((InputStream)var1).read();
  155.          int var4 = ((InputStream)var1).read();
  156.          int var5 = ((InputStream)var1).read();
  157.          ((InputStream)var1).read();
  158.          ((InputStream)var1).read();
  159.          ((InputStream)var1).reset();
  160.          if (var2 == 71 && var3 == 73 && var4 == 70 && var5 == 56) {
  161.             return new GifImageDecoder(this, (InputStream)var1);
  162.          }
  163.  
  164.          if (var2 == 255 && var3 == 216 && var4 == 255 && var5 == 224 || var2 == 255 && var3 == 216 && var4 == 255 && var5 == 238) {
  165.             return new JPEGImageDecoder(this, (InputStream)var1);
  166.          }
  167.  
  168.          if (var2 == 35 && var3 == 100 && var4 == 101 && var5 == 102) {
  169.             return new XbmImageDecoder(this, (InputStream)var1);
  170.          }
  171.       } catch (IOException var6) {
  172.       }
  173.  
  174.       return null;
  175.    }
  176.  
  177.    public void doFetch() {
  178.       Thread var1 = Thread.currentThread();
  179.       ImageDecoder var2 = null;
  180.  
  181.       try {
  182.          if (this.latchConsumers(var1) <= 0) {
  183.             return;
  184.          }
  185.  
  186.          if (!this.updateFromStore(var1)) {
  187.             var2 = this.getDecoder();
  188.             if (var2 != null) {
  189.                this.setDecoder(var2, var1);
  190.  
  191.                try {
  192.                   var2.produceImage();
  193.                } catch (IOException var9) {
  194.                   ((Throwable)var9).printStackTrace();
  195.                } catch (ImageFormatException var10) {
  196.                   ((Throwable)var10).printStackTrace();
  197.                }
  198.  
  199.                return;
  200.             }
  201.  
  202.             return;
  203.          }
  204.       } finally {
  205.          this.imageComplete(1);
  206.          this.unlatchConsumers(var2, var1);
  207.       }
  208.  
  209.    }
  210.  
  211.    private boolean updateFromStore(Thread var1) {
  212.       synchronized(this){}
  213.  
  214.       PixelStore var2;
  215.       ConsumerQueue var3;
  216.       try {
  217.          var2 = this.pixelstore;
  218.          if (var2 == null) {
  219.             boolean var6 = false;
  220.             return var6;
  221.          }
  222.  
  223.          var3 = this.consumers;
  224.       } catch (Throwable var18) {
  225.          throw var18;
  226.       }
  227.  
  228.       while(var3 != null) {
  229.          synchronized(this){}
  230.  
  231.          try {
  232.             if (var3.feeder == null) {
  233.                if (!this.checkSecurity(var3.securityContext, true)) {
  234.                   this.errorConsumer(var3);
  235.                } else {
  236.                   var3.feeder = var1;
  237.                }
  238.             }
  239.  
  240.             if (var3.feeder != var1) {
  241.                var3 = var3.next;
  242.                continue;
  243.             }
  244.          } catch (Throwable var17) {
  245.             throw var17;
  246.          }
  247.  
  248.          if (!var2.replay(this, var3.consumer)) {
  249.             return false;
  250.          }
  251.  
  252.          synchronized(this){}
  253.  
  254.          try {
  255.             var3 = var3.next;
  256.          } catch (Throwable var16) {
  257.             throw var16;
  258.          }
  259.       }
  260.  
  261.       return true;
  262.    }
  263.  
  264.    private synchronized void setDecoder(ImageDecoder var1, Thread var2) {
  265.       for(ConsumerQueue var3 = this.consumers; var3 != null; var3 = var3.next) {
  266.          if (var3.feeder == var2) {
  267.             if (!this.checkSecurity(var3.securityContext, true)) {
  268.                this.errorConsumer(var3);
  269.             } else {
  270.                var3.decoder = var1;
  271.             }
  272.          }
  273.       }
  274.  
  275.       if (this.latestFetcher == var2) {
  276.          this.decoder = var1;
  277.       }
  278.  
  279.    }
  280.  
  281.    private synchronized int latchConsumers(Thread var1) {
  282.       this.latestFetcher = var1;
  283.       this.awaitingFetch = false;
  284.       ConsumerQueue var2 = this.consumers;
  285.  
  286.       int var3;
  287.       for(var3 = 0; var2 != null; var2 = var2.next) {
  288.          if (var2.feeder == null) {
  289.             if (!this.checkSecurity(var2.securityContext, true)) {
  290.                this.errorConsumer(var2);
  291.             } else {
  292.                var2.feeder = var1;
  293.                ++var3;
  294.             }
  295.          }
  296.       }
  297.  
  298.       return var3;
  299.    }
  300.  
  301.    private synchronized void unlatchConsumers(ImageDecoder var1, Thread var2) {
  302.       if (this.latestFetcher == var2) {
  303.          this.latestFetcher = null;
  304.       }
  305.  
  306.       ConsumerQueue var3 = this.consumers;
  307.  
  308.       for(ConsumerQueue var4 = null; var3 != null; var3 = var3.next) {
  309.          if (var3.feeder == var2) {
  310.             if (var4 == null) {
  311.                this.consumers = var3.next;
  312.             } else {
  313.                var4.next = var3.next;
  314.             }
  315.          } else {
  316.             if (var3.feeder == null) {
  317.                this.startProduction();
  318.             }
  319.  
  320.             var4 = var3;
  321.          }
  322.       }
  323.  
  324.    }
  325.  
  326.    private ConsumerQueue nextConsumer(ConsumerQueue var1, Thread var2) {
  327.       synchronized(this){}
  328.  
  329.       try {
  330.          if (var1 == null) {
  331.             var1 = this.consumers;
  332.          } else {
  333.             var1 = var1.next;
  334.          }
  335.  
  336.          while(var1 != null) {
  337.             if (var1.interested) {
  338.                if (var1.feeder == var2) {
  339.                   ConsumerQueue var5 = var1;
  340.                   return var5;
  341.                }
  342.  
  343.                if (var1.feeder == null && this.latestFetcher == var2) {
  344.                   break;
  345.                }
  346.  
  347.                var1 = var1.next;
  348.             }
  349.          }
  350.       } catch (Throwable var17) {
  351.          throw var17;
  352.       }
  353.  
  354.       if (var1 != null) {
  355.          if (this.decoder != null && this.decoder.catchupConsumer(this, var1.consumer)) {
  356.             synchronized(this){}
  357.  
  358.             ConsumerQueue var19;
  359.             try {
  360.                if (!var1.interested) {
  361.                   return this.nextConsumer(var1, var2);
  362.                }
  363.  
  364.                if (!this.checkSecurity(var1.securityContext, true)) {
  365.                   this.errorConsumer(var1);
  366.                   return this.nextConsumer(var1, var2);
  367.                }
  368.  
  369.                var1.feeder = var2;
  370.                var1.decoder = this.decoder;
  371.                var19 = var1;
  372.             } catch (Throwable var16) {
  373.                throw var16;
  374.             }
  375.  
  376.             return var19;
  377.          }
  378.  
  379.          synchronized(this){}
  380.  
  381.          try {
  382.             this.latestFetcher = null;
  383.             this.startProduction();
  384.          } catch (Throwable var15) {
  385.             throw var15;
  386.          }
  387.       }
  388.  
  389.       return var1;
  390.    }
  391.  
  392.    synchronized void flush() {
  393.       ConsumerQueue var1 = this.consumers;
  394.  
  395.       for(this.consumers = null; var1 != null; var1 = var1.next) {
  396.          var1.interested = false;
  397.  
  398.          try {
  399.             if (var1.feeder != null) {
  400.                var1.feeder.interrupt();
  401.             }
  402.          } catch (NoSuchMethodError var2) {
  403.             break;
  404.          }
  405.  
  406.          if (var1.decoder != null) {
  407.             var1.decoder.close();
  408.          }
  409.       }
  410.  
  411.       this.pixelstore = null;
  412.    }
  413.  
  414.    synchronized void setPixelStore(PixelStore var1) {
  415.       this.pixelstore = var1;
  416.    }
  417.  
  418.    int setDimensions(int var1, int var2) {
  419.       ConsumerQueue var3 = null;
  420.       Thread var4 = Thread.currentThread();
  421.  
  422.       int var5;
  423.       for(var5 = 0; (var3 = this.nextConsumer(var3, var4)) != null; ++var5) {
  424.          var3.consumer.setDimensions(var1, var2);
  425.       }
  426.  
  427.       return var5;
  428.    }
  429.  
  430.    int setProperties(Hashtable var1) {
  431.       ConsumerQueue var2 = null;
  432.       Thread var3 = Thread.currentThread();
  433.  
  434.       int var4;
  435.       for(var4 = 0; (var2 = this.nextConsumer(var2, var3)) != null; ++var4) {
  436.          var2.consumer.setProperties(var1);
  437.       }
  438.  
  439.       return var4;
  440.    }
  441.  
  442.    int setColorModel(ColorModel var1) {
  443.       ConsumerQueue var2 = null;
  444.       Thread var3 = Thread.currentThread();
  445.  
  446.       int var4;
  447.       for(var4 = 0; (var2 = this.nextConsumer(var2, var3)) != null; ++var4) {
  448.          var2.consumer.setColorModel(var1);
  449.       }
  450.  
  451.       return var4;
  452.    }
  453.  
  454.    int setHints(int var1) {
  455.       ConsumerQueue var2 = null;
  456.       Thread var3 = Thread.currentThread();
  457.  
  458.       int var4;
  459.       for(var4 = 0; (var2 = this.nextConsumer(var2, var3)) != null; ++var4) {
  460.          var2.consumer.setHints(var1);
  461.       }
  462.  
  463.       return var4;
  464.    }
  465.  
  466.    int setPixels(int var1, int var2, int var3, int var4, ColorModel var5, byte[] var6, int var7, int var8) {
  467.       ConsumerQueue var9 = null;
  468.       Thread var10 = Thread.currentThread();
  469.       if (var10.getPriority() > 3) {
  470.          var10.setPriority(3);
  471.       }
  472.  
  473.       int var11;
  474.       for(var11 = 0; (var9 = this.nextConsumer(var9, var10)) != null; ++var11) {
  475.          var9.consumer.setPixels(var1, var2, var3, var4, var5, var6, var7, var8);
  476.       }
  477.  
  478.       return var11;
  479.    }
  480.  
  481.    int setPixels(int var1, int var2, int var3, int var4, ColorModel var5, int[] var6, int var7, int var8) {
  482.       ConsumerQueue var9 = null;
  483.       Thread var10 = Thread.currentThread();
  484.       if (var10.getPriority() > 3) {
  485.          var10.setPriority(3);
  486.       }
  487.  
  488.       int var11;
  489.       for(var11 = 0; (var9 = this.nextConsumer(var9, var10)) != null; ++var11) {
  490.          var9.consumer.setPixels(var1, var2, var3, var4, var5, var6, var7, var8);
  491.       }
  492.  
  493.       return var11;
  494.    }
  495.  
  496.    int imageComplete(int var1) {
  497.       ConsumerQueue var2 = null;
  498.       Thread var3 = Thread.currentThread();
  499.  
  500.       int var4;
  501.       for(var4 = 0; (var2 = this.nextConsumer(var2, var3)) != null; ++var4) {
  502.          var2.consumer.imageComplete(var1);
  503.       }
  504.  
  505.       return var4;
  506.    }
  507. }
  508.